import { CompatibleExpression } from '../../../expression/expression';
import { Scalar } from '../../../scalar';
import {
  ColumnsOf,
  InputObject,
  RowObject,
  RowObjectFrom,
} from '../../../types';
import { Select } from '../select';
import { Star } from '../star';
import { SelectColumn } from '../select-column';
import { ColumnKeyOf } from '../../../../../orm';
import { Field } from '../../../expression';

/**
 * 自动列名前缀
 */
export const COLUMN_NAME_PREEFIX = '#column_';
export type DefaultColumnName = '#column_1';
export const DEFAULT_COLUMN_NAME: DefaultColumnName = '#column_1';
/**
 * SELECT函数签名
 */
export type SelectAction = {
  /**
   * 整表返回
   */
  <T extends RowObject>(a: Star<T>): Select<T>;
  /**
   * 单个值查询
   */
  // <T extends Scalar>(value: CompatibleExpression<T>): Select<{
  //   '#column_1': T;
  // }>;
  <T extends Scalar>(expr: CompatibleExpression<T>): Select<{
    '*no name': T;
  }>;
  <T extends RowObject>(fields: SelectColumn): Select<T>;
  <T extends InputObject>(results: T): Select<RowObjectFrom<T>>;
  <T extends RowObject>(results: InputObject<T>): Select<T>;
  // <
  //   A extends SelectColumn | Field,
  //   B extends SelectCloumn | Field,
  //   C extends SelectCloumn | Field,
  //   D extends SelectCloumn | Field,
  //   E extends SelectCloumn | Field,
  //   F extends SelectCloumn | Field,
  //   G extends SelectCloumn | Field,
  //   H extends SelectCloumn | Field,
  //   I extends SelectCloumn | Field,
  //   J extends SelectCloumn | Field,
  //   K extends SelectCloumn | Field,
  //   L extends SelectCloumn | Field,
  //   M extends SelectCloumn | Field,
  //   N extends SelectCloumn | Field,
  //   O extends SelectCloumn | Field,
  //   P extends SelectCloumn | Field,
  //   Q extends SelectCloumn | Field,
  //   R extends SelectCloumn | Field,
  //   S extends SelectCloumn | Field,
  //   T extends SelectCloumn | Field,
  //   U extends SelectCloumn | Field,
  //   V extends SelectCloumn | Field,
  //   W extends SelectCloumn | Field,
  //   X extends SelectCloumn | Field,
  //   Y extends SelectCloumn | Field,
  //   Z extends SelectCloumn | Field
  // >(
  //   a: A,
  //   b: B,
  //   c: C,
  //   d: D,
  //   e: E,
  //   f: F,
  //   g: G,
  //   h: H,
  //   i: I,
  //   j: J,
  //   k: K,
  //   l: L,
  //   m: M,
  //   n: N,
  //   o: O,
  //   p: P,
  //   q: Q,
  //   r: R,
  //   s: S,
  //   t: T,
  //   u: U,
  //   v: V,
  //   w: W,
  //   x: X,
  //   y: Y,
  //   z: Z
  // ): Select<
  //   RowTypeByColumns<
  //     A,
  //     B,
  //     C,
  //     D,
  //     E,
  //     F,
  //     G,
  //     H,
  //     I,
  //     J,
  //     K,
  //     L,
  //     M,
  //     N,
  //     O,
  //     P,
  //     Q,
  //     R,
  //     S,
  //     T,
  //     U,
  //     V,
  //     W,
  //     X,
  //     Y,
  //     Z
  //   >
  // >;

  // <T extends RowObject = DefaultRowObject>(
  //   ...columns: (SelectColumn | CompatibleExpression | Star<any>)[]
  // ): Select<T>;
  // <A extends CompatibleExpression>(a: A): Select<{ unnamed: TypeOf<A> }>;
  // <A extends SelectCloumn, B extends SelectCloumn>(a: A, b: B): Select<
  //   RowTypeByColumns<A, B>
  // >;
  // <A extends SelectCloumn, B extends SelectCloumn, C extends SelectCloumn>(
  //   a: A,
  //   b?: B,
  //   d?: C
  // ): Select<RowTypeByColumns<A, B, C>>;
  // <
  //   A extends SelectCloumn,
  //   B extends SelectCloumn,
  //   C extends SelectCloumn,
  //   D extends SelectCloumn
  // >(
  //   a: A,
  //   b: B,
  //   c: C,
  //   d: D
  // ): Select<RowTypeByColumns<A, B, C, D>>;
  // <
  //   A extends SelectCloumn,
  //   B extends SelectCloumn,
  //   C extends SelectCloumn,
  //   D extends SelectCloumn,
  //   E extends SelectCloumn
  // >(
  //   a: A,
  //   b: B,
  //   c: C,
  //   d: D,
  //   e: E
  // ): Select<RowTypeByColumns<A, B, C, D, E>>;
  // <
  //   A extends SelectCloumn,
  //   B extends SelectCloumn,
  //   C extends SelectCloumn,
  //   D extends SelectCloumn,
  //   E extends SelectCloumn,
  //   F extends SelectCloumn
  // >(
  //   a: A,
  //   b: B,
  //   c: C,
  //   d: D,
  //   e: E,
  //   f: F
  // ): Select<RowTypeByColumns<A, B, C, D, E, F>>;
  // <
  //   A extends SelectCloumn,
  //   B extends SelectCloumn,
  //   C extends SelectCloumn,
  //   D extends SelectCloumn,
  //   E extends SelectCloumn,
  //   F extends SelectCloumn,
  //   G extends SelectCloumn
  // >(
  //   a: A,
  //   b: B,
  //   c: C,
  //   d: D,
  //   e: E,
  //   f: F,
  //   g: G
  // ): Select<RowTypeByColumns<A, B, C, D, E, F, G>>;
  // <
  //   A extends SelectCloumn,
  //   B extends SelectCloumn,
  //   C extends SelectCloumn,
  //   D extends SelectCloumn,
  //   E extends SelectCloumn,
  //   F extends SelectCloumn,
  //   G extends SelectCloumn,
  //   H extends SelectCloumn
  // >(
  //   a: A,
  //   b: B,
  //   c: C,
  //   d: D,
  //   e: E,
  //   f: F,
  //   g: G,
  //   h: H
  // ): Select<RowTypeByColumns<A, B, C, D, E, F, G, H>>;
  // <
  //   A extends SelectCloumn,
  //   B extends SelectCloumn,
  //   C extends SelectCloumn,
  //   D extends SelectCloumn,
  //   E extends SelectCloumn,
  //   F extends SelectCloumn,
  //   G extends SelectCloumn,
  //   H extends SelectCloumn,
  //   I extends SelectCloumn
  // >(
  //   a: A,
  //   b: B,
  //   c: C,
  //   d: D,
  //   e: E,
  //   f: F,
  //   g: G,
  //   h: H,
  //   i: I
  // ): Select<RowTypeByColumns<A, B, C, D, E, F, G, H, I>>;
  // <
  //   A extends SelectCloumn,
  //   B extends SelectCloumn,
  //   C extends SelectCloumn,
  //   D extends SelectCloumn,
  //   E extends SelectCloumn,
  //   F extends SelectCloumn,
  //   G extends SelectCloumn,
  //   H extends SelectCloumn,
  //   I extends SelectCloumn,
  //   J extends SelectCloumn
  // >(
  //   a: A,
  //   b: B,
  //   c: C,
  //   d: D,
  //   e: E,
  //   f: F,
  //   g: G,
  //   h: H,
  //   i: I,
  //   j: J
  // ): Select<RowTypeByColumns<A, B, C, D, E, F, G, H, I, J>>;
  // <
  //   A extends SelectCloumn,
  //   B extends SelectCloumn,
  //   C extends SelectCloumn,
  //   D extends SelectCloumn,
  //   E extends SelectCloumn,
  //   F extends SelectCloumn,
  //   G extends SelectCloumn,
  //   H extends SelectCloumn,
  //   I extends SelectCloumn,
  //   J extends SelectCloumn,
  //   K extends SelectCloumn
  // >(
  //   a: A,
  //   b: B,
  //   c: C,
  //   d: D,
  //   e: E,
  //   f: F,
  //   g: G,
  //   h: H,
  //   i: I,
  //   j: J,
  //   k: K
  // ): Select<RowTypeByColumns<A, B, C, D, E, F, G, H, I, J, K>>;
  // <
  //   A extends SelectCloumn,
  //   B extends SelectCloumn,
  //   C extends SelectCloumn,
  //   D extends SelectCloumn,
  //   E extends SelectCloumn,
  //   F extends SelectCloumn,
  //   G extends SelectCloumn,
  //   H extends SelectCloumn,
  //   I extends SelectCloumn,
  //   J extends SelectCloumn,
  //   K extends SelectCloumn,
  //   L extends SelectCloumn
  // >(
  //   a: A,
  //   b: B,
  //   c: C,
  //   d: D,
  //   e: E,
  //   f: F,
  //   g: G,
  //   h: H,
  //   i: I,
  //   j: J,
  //   k: K,
  //   l: L
  // ): Select<RowTypeByColumns<A, B, C, D, E, F, G, H, I, J, K, L>>;
  // <
  //   A extends SelectCloumn,
  //   B extends SelectCloumn,
  //   C extends SelectCloumn,
  //   D extends SelectCloumn,
  //   E extends SelectCloumn,
  //   F extends SelectCloumn,
  //   G extends SelectCloumn,
  //   H extends SelectCloumn,
  //   I extends SelectCloumn,
  //   J extends SelectCloumn,
  //   K extends SelectCloumn,
  //   L extends SelectCloumn,
  //   M extends SelectCloumn
  // >(
  //   a: A,
  //   b: B,
  //   c: C,
  //   d: D,
  //   e: E,
  //   f: F,
  //   g: G,
  //   h: H,
  //   i: I,
  //   j: J,
  //   k: K,
  //   l: L,
  //   m: M
  // ): Select<RowTypeByColumns<A, B, C, D, E, F, G, H, I, J, K, L, M>>;
  // <
  //   A extends SelectCloumn,
  //   B extends SelectCloumn,
  //   C extends SelectCloumn,
  //   D extends SelectCloumn,
  //   E extends SelectCloumn,
  //   F extends SelectCloumn,
  //   G extends SelectCloumn,
  //   H extends SelectCloumn,
  //   I extends SelectCloumn,
  //   J extends SelectCloumn,
  //   K extends SelectCloumn,
  //   L extends SelectCloumn,
  //   M extends SelectCloumn,
  //   N extends SelectCloumn
  // >(
  //   a: A,
  //   b: B,
  //   c: C,
  //   d: D,
  //   e: E,
  //   f: F,
  //   g: G,
  //   h: H,
  //   i: I,
  //   j: J,
  //   k: K,
  //   l: L,
  //   m: M,
  //   n: N
  // ): Select<RowTypeByColumns<A, B, C, D, E, F, G, H, I, J, K, L, M, N>>;
  // <
  //   A extends SelectCloumn,
  //   B extends SelectCloumn,
  //   C extends SelectCloumn,
  //   D extends SelectCloumn,
  //   E extends SelectCloumn,
  //   F extends SelectCloumn,
  //   G extends SelectCloumn,
  //   H extends SelectCloumn,
  //   I extends SelectCloumn,
  //   J extends SelectCloumn,
  //   K extends SelectCloumn,
  //   L extends SelectCloumn,
  //   M extends SelectCloumn,
  //   N extends SelectCloumn,
  //   O extends SelectCloumn
  // >(
  //   a: A,
  //   b: B,
  //   c: C,
  //   d: D,
  //   e: E,
  //   f: F,
  //   g: G,
  //   h: H,
  //   i: I,
  //   j: J,
  //   k: K,
  //   l: L,
  //   m: M,
  //   n: N,
  //   o: O
  // ): Select<RowTypeByColumns<A, B, C, D, E, F, G, H, I, J, K, L, M, N, O>>;
  // <
  //   A extends SelectCloumn,
  //   B extends SelectCloumn,
  //   C extends SelectCloumn,
  //   D extends SelectCloumn,
  //   E extends SelectCloumn,
  //   F extends SelectCloumn,
  //   G extends SelectCloumn,
  //   H extends SelectCloumn,
  //   I extends SelectCloumn,
  //   J extends SelectCloumn,
  //   K extends SelectCloumn,
  //   L extends SelectCloumn,
  //   M extends SelectCloumn,
  //   N extends SelectCloumn,
  //   O extends SelectCloumn,
  //   P extends SelectCloumn
  // >(
  //   a: A,
  //   b: B,
  //   c: C,
  //   d: D,
  //   e: E,
  //   f: F,
  //   g: G,
  //   h: H,
  //   i: I,
  //   j: J,
  //   k: K,
  //   l: L,
  //   m: M,
  //   n: N,
  //   o: O,
  //   p: P
  // ): Select<RowTypeByColumns<A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P>>;
  // <
  //   A extends SelectCloumn,
  //   B extends SelectCloumn,
  //   C extends SelectCloumn,
  //   D extends SelectCloumn,
  //   E extends SelectCloumn,
  //   F extends SelectCloumn,
  //   G extends SelectCloumn,
  //   H extends SelectCloumn,
  //   I extends SelectCloumn,
  //   J extends SelectCloumn,
  //   K extends SelectCloumn,
  //   L extends SelectCloumn,
  //   M extends SelectCloumn,
  //   N extends SelectCloumn,
  //   O extends SelectCloumn,
  //   P extends SelectCloumn,
  //   Q extends SelectCloumn
  // >(
  //   a: A,
  //   b: B,
  //   c: C,
  //   d: D,
  //   e: E,
  //   f: F,
  //   g: G,
  //   h: H,
  //   i: I,
  //   j: J,
  //   k: K,
  //   l: L,
  //   m: M,
  //   n: N,
  //   o: O,
  //   p: P,
  //   q: Q
  // ): Select<
  //   RowTypeByColumns<A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q>
  // >;
  // <
  //   A extends SelectCloumn,
  //   B extends SelectCloumn,
  //   C extends SelectCloumn,
  //   D extends SelectCloumn,
  //   E extends SelectCloumn,
  //   F extends SelectCloumn,
  //   G extends SelectCloumn,
  //   H extends SelectCloumn,
  //   I extends SelectCloumn,
  //   J extends SelectCloumn,
  //   K extends SelectCloumn,
  //   L extends SelectCloumn,
  //   M extends SelectCloumn,
  //   N extends SelectCloumn,
  //   O extends SelectCloumn,
  //   P extends SelectCloumn,
  //   Q extends SelectCloumn,
  //   R extends SelectCloumn
  // >(
  //   a: A,
  //   b: B,
  //   c: C,
  //   d: D,
  //   e: E,
  //   f: F,
  //   g: G,
  //   h: H,
  //   i: I,
  //   j: J,
  //   k: K,
  //   l: L,
  //   m: M,
  //   n: N,
  //   o: O,
  //   p: P,
  //   q: Q,
  //   r: R
  // ): Select<
  //   RowTypeByColumns<A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R>
  // >;
  // <
  //   A extends SelectCloumn,
  //   B extends SelectCloumn,
  //   C extends SelectCloumn,
  //   D extends SelectCloumn,
  //   E extends SelectCloumn,
  //   F extends SelectCloumn,
  //   G extends SelectCloumn,
  //   H extends SelectCloumn,
  //   I extends SelectCloumn,
  //   J extends SelectCloumn,
  //   K extends SelectCloumn,
  //   L extends SelectCloumn,
  //   M extends SelectCloumn,
  //   N extends SelectCloumn,
  //   O extends SelectCloumn,
  //   P extends SelectCloumn,
  //   Q extends SelectCloumn,
  //   R extends SelectCloumn,
  //   S extends SelectCloumn
  // >(
  //   a: A,
  //   b: B,
  //   c: C,
  //   d: D,
  //   e: E,
  //   f: F,
  //   g: G,
  //   h: H,
  //   i: I,
  //   j: J,
  //   k: K,
  //   l: L,
  //   m: M,
  //   n: N,
  //   o: O,
  //   p: P,
  //   q: Q,
  //   r: R,
  //   s: S
  // ): Select<
  //   RowTypeByColumns<A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S>
  // >;
  // <
  //   A extends SelectCloumn,
  //   B extends SelectCloumn,
  //   C extends SelectCloumn,
  //   D extends SelectCloumn,
  //   E extends SelectCloumn,
  //   F extends SelectCloumn,
  //   G extends SelectCloumn,
  //   H extends SelectCloumn,
  //   I extends SelectCloumn,
  //   J extends SelectCloumn,
  //   K extends SelectCloumn,
  //   L extends SelectCloumn,
  //   M extends SelectCloumn,
  //   N extends SelectCloumn,
  //   O extends SelectCloumn,
  //   P extends SelectCloumn,
  //   Q extends SelectCloumn,
  //   R extends SelectCloumn,
  //   S extends SelectCloumn,
  //   T extends SelectCloumn
  // >(
  //   a: A,
  //   b: B,
  //   c: C,
  //   d: D,
  //   e: E,
  //   f: F,
  //   g: G,
  //   h: H,
  //   i: I,
  //   j: J,
  //   k: K,
  //   l: L,
  //   m: M,
  //   n: N,
  //   o: O,
  //   p: P,
  //   q: Q,
  //   r: R,
  //   s: S,
  //   t: T
  // ): Select<
  //   RowTypeByColumns<A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T>
  // >;
  // <
  //   A extends SelectCloumn,
  //   B extends SelectCloumn,
  //   C extends SelectCloumn,
  //   D extends SelectCloumn,
  //   E extends SelectCloumn,
  //   F extends SelectCloumn,
  //   G extends SelectCloumn,
  //   H extends SelectCloumn,
  //   I extends SelectCloumn,
  //   J extends SelectCloumn,
  //   K extends SelectCloumn,
  //   L extends SelectCloumn,
  //   M extends SelectCloumn,
  //   N extends SelectCloumn,
  //   O extends SelectCloumn,
  //   P extends SelectCloumn,
  //   Q extends SelectCloumn,
  //   R extends SelectCloumn,
  //   S extends SelectCloumn,
  //   T extends SelectCloumn,
  //   U extends SelectCloumn
  // >(
  //   a: A,
  //   b: B,
  //   c: C,
  //   d: D,
  //   e: E,
  //   f: F,
  //   g: G,
  //   h: H,
  //   i: I,
  //   j: J,
  //   k: K,
  //   l: L,
  //   m: M,
  //   n: N,
  //   o: O,
  //   p: P,
  //   q: Q,
  //   r: R,
  //   s: S,
  //   t: T,
  //   u: U
  // ): Select<
  //   RowTypeByColumns<
  //     A,
  //     B,
  //     C,
  //     D,
  //     E,
  //     F,
  //     G,
  //     H,
  //     I,
  //     J,
  //     K,
  //     L,
  //     M,
  //     N,
  //     O,
  //     P,
  //     Q,
  //     R,
  //     S,
  //     T,
  //     U
  //   >
  // >;
  // <
  //   A extends SelectCloumn,
  //   B extends SelectCloumn,
  //   C extends SelectCloumn,
  //   D extends SelectCloumn,
  //   E extends SelectCloumn,
  //   F extends SelectCloumn,
  //   G extends SelectCloumn,
  //   H extends SelectCloumn,
  //   I extends SelectCloumn,
  //   J extends SelectCloumn,
  //   K extends SelectCloumn,
  //   L extends SelectCloumn,
  //   M extends SelectCloumn,
  //   N extends SelectCloumn,
  //   O extends SelectCloumn,
  //   P extends SelectCloumn,
  //   Q extends SelectCloumn,
  //   R extends SelectCloumn,
  //   S extends SelectCloumn,
  //   T extends SelectCloumn,
  //   U extends SelectCloumn,
  //   V extends SelectCloumn
  // >(
  //   a: A,
  //   b: B,
  //   c: C,
  //   d: D,
  //   e: E,
  //   f: F,
  //   g: G,
  //   h: H,
  //   i: I,
  //   j: J,
  //   k: K,
  //   l: L,
  //   m: M,
  //   n: N,
  //   o: O,
  //   p: P,
  //   q: Q,
  //   r: R,
  //   s: S,
  //   t: T,
  //   u: U,
  //   v: V
  // ): Select<
  //   RowTypeByColumns<
  //     A,
  //     B,
  //     C,
  //     D,
  //     E,
  //     F,
  //     G,
  //     H,
  //     I,
  //     J,
  //     K,
  //     L,
  //     M,
  //     N,
  //     O,
  //     P,
  //     Q,
  //     R,
  //     S,
  //     T,
  //     U,
  //     V
  //   >
  // >;
  // <
  //   A extends SelectCloumn,
  //   B extends SelectCloumn,
  //   C extends SelectCloumn,
  //   D extends SelectCloumn,
  //   E extends SelectCloumn,
  //   F extends SelectCloumn,
  //   G extends SelectCloumn,
  //   H extends SelectCloumn,
  //   I extends SelectCloumn,
  //   J extends SelectCloumn,
  //   K extends SelectCloumn,
  //   L extends SelectCloumn,
  //   M extends SelectCloumn,
  //   N extends SelectCloumn,
  //   O extends SelectCloumn,
  //   P extends SelectCloumn,
  //   Q extends SelectCloumn,
  //   R extends SelectCloumn,
  //   S extends SelectCloumn,
  //   T extends SelectCloumn,
  //   U extends SelectCloumn,
  //   V extends SelectCloumn,
  //   W extends SelectCloumn
  // >(
  //   a: A,
  //   b: B,
  //   c: C,
  //   d: D,
  //   e: E,
  //   f: F,
  //   g: G,
  //   h: H,
  //   i: I,
  //   j: J,
  //   k: K,
  //   l: L,
  //   m: M,
  //   n: N,
  //   o: O,
  //   p: P,
  //   q: Q,
  //   r: R,
  //   s: S,
  //   t: T,
  //   u: U,
  //   v: V,
  //   w: W
  // ): Select<
  //   RowTypeByColumns<
  //     A,
  //     B,
  //     C,
  //     D,
  //     E,
  //     F,
  //     G,
  //     H,
  //     I,
  //     J,
  //     K,
  //     L,
  //     M,
  //     N,
  //     O,
  //     P,
  //     Q,
  //     R,
  //     S,
  //     T,
  //     U,
  //     V,
  //     W
  //   >
  // >;
  // <
  //   A extends SelectCloumn,
  //   B extends SelectCloumn,
  //   C extends SelectCloumn,
  //   D extends SelectCloumn,
  //   E extends SelectCloumn,
  //   F extends SelectCloumn,
  //   G extends SelectCloumn,
  //   H extends SelectCloumn,
  //   I extends SelectCloumn,
  //   J extends SelectCloumn,
  //   K extends SelectCloumn,
  //   L extends SelectCloumn,
  //   M extends SelectCloumn,
  //   N extends SelectCloumn,
  //   O extends SelectCloumn,
  //   P extends SelectCloumn,
  //   Q extends SelectCloumn,
  //   R extends SelectCloumn,
  //   S extends SelectCloumn,
  //   T extends SelectCloumn,
  //   U extends SelectCloumn,
  //   V extends SelectCloumn,
  //   W extends SelectCloumn,
  //   X extends SelectCloumn
  // >(
  //   a: A,
  //   b: B,
  //   c: C,
  //   d: D,
  //   e: E,
  //   f: F,
  //   g: G,
  //   h: H,
  //   i: I,
  //   j: J,
  //   k: K,
  //   l: L,
  //   m: M,
  //   n: N,
  //   o: O,
  //   p: P,
  //   q: Q,
  //   r: R,
  //   s: S,
  //   t: T,
  //   u: U,
  //   v: V,
  //   w: W,
  //   x: X
  // ): Select<
  //   RowTypeByColumns<
  //     A,
  //     B,
  //     C,
  //     D,
  //     E,
  //     F,
  //     G,
  //     H,
  //     I,
  //     J,
  //     K,
  //     L,
  //     M,
  //     N,
  //     O,
  //     P,
  //     Q,
  //     R,
  //     S,
  //     T,
  //     U,
  //     V,
  //     W,
  //     X
  //   >
  // >;
  // <
  //   A extends SelectCloumn,
  //   B extends SelectCloumn,
  //   C extends SelectCloumn,
  //   D extends SelectCloumn,
  //   E extends SelectCloumn,
  //   F extends SelectCloumn,
  //   G extends SelectCloumn,
  //   H extends SelectCloumn,
  //   I extends SelectCloumn,
  //   J extends SelectCloumn,
  //   K extends SelectCloumn,
  //   L extends SelectCloumn,
  //   M extends SelectCloumn,
  //   N extends SelectCloumn,
  //   O extends SelectCloumn,
  //   P extends SelectCloumn,
  //   Q extends SelectCloumn,
  //   R extends SelectCloumn,
  //   S extends SelectCloumn,
  //   T extends SelectCloumn,
  //   U extends SelectCloumn,
  //   V extends SelectCloumn,
  //   W extends SelectCloumn,
  //   X extends SelectCloumn,
  //   Y extends SelectCloumn
  // >(
  //   a: A,
  //   b: B,
  //   c: C,
  //   d: D,
  //   e: E,
  //   f: F,
  //   g: G,
  //   h: H,
  //   i: I,
  //   j: J,
  //   k: K,
  //   l: L,
  //   m: M,
  //   n: N,
  //   o: O,
  //   p: P,
  //   q: Q,
  //   r: R,
  //   s: S,
  //   t: T,
  //   u: U,
  //   v: V,
  //   w: W,
  //   x: X,
  //   y: Y
  // ): Select<
  //   RowTypeByColumns<
  //     A,
  //     B,
  //     C,
  //     D,
  //     E,
  //     F,
  //     G,
  //     H,
  //     I,
  //     J,
  //     K,
  //     L,
  //     M,
  //     N,
  //     O,
  //     P,
  //     Q,
  //     R,
  //     S,
  //     T,
  //     U,
  //     V,
  //     W,
  //     X,
  //     Y
  //   >
  // >;
  // <
  //   A extends SelectCloumn,
  //   B extends SelectCloumn,
  //   C extends SelectCloumn,
  //   D extends SelectCloumn,
  //   E extends SelectCloumn,
  //   F extends SelectCloumn,
  //   G extends SelectCloumn,
  //   H extends SelectCloumn,
  //   I extends SelectCloumn,
  //   J extends SelectCloumn,
  //   K extends SelectCloumn,
  //   L extends SelectCloumn,
  //   M extends SelectCloumn,
  //   N extends SelectCloumn,
  //   O extends SelectCloumn,
  //   P extends SelectCloumn,
  //   Q extends SelectCloumn,
  //   R extends SelectCloumn,
  //   S extends SelectCloumn,
  //   T extends SelectCloumn,
  //   U extends SelectCloumn,
  //   V extends SelectCloumn,
  //   W extends SelectCloumn,
  //   X extends SelectCloumn,
  //   Y extends SelectCloumn,
  //   Z extends SelectCloumn
  // >(
  //   a: A,
  //   b: B,
  //   c: C,
  //   d: D,
  //   e: E,
  //   f: F,
  //   g: G,
  //   h: H,
  //   i: I,
  //   j: J,
  //   k: K,
  //   l: L,
  //   m: M,
  //   n: N,
  //   o: O,
  //   p: P,
  //   q: Q,
  //   r: R,
  //   s: S,
  //   t: T,
  //   u: U,
  //   v: V,
  //   w: W,
  //   x: X,
  //   y: Y,
  //   z: Z
  // ): Select<
  //   RowTypeByColumns<
  //     A,
  //     B,
  //     C,
  //     D,
  //     E,
  //     F,
  //     G,
  //     H,
  //     I,
  //     J,
  //     K,
  //     L,
  //     M,
  //     N,
  //     O,
  //     P,
  //     Q,
  //     R,
  //     S,
  //     T,
  //     U,
  //     V,
  //     W,
  //     X,
  //     Y,
  //     Z
  //   >
  // >;
};
